crackmeUK UKさんのソース


この度、 UKさんからソースを頂きました♪
これを参考にしてみんなでkgを作ってみましょう♪

=======================================================================================================
UKさんのソース
=======================================================================================================


/* strの指しているポイントから4文字
 16進数かチェックしながら文字から数字へ
 変える関数*/

int myatoi(char* str)
{
	for(int i=0;i<4;i++){
		if(0x30 <= str[i] && str[i] <= 0x39)
			str[i] -= 0x30;
		else if(0x41 <= str[i] && str[i] <=0x46)
			str[i] -= 0x37;
		else
			return 0;
	}
	return 1;
}

/*構造体*/
typedef struct
{
	char* s;
	DWORD id;
} STRID;

int CheckMiddle()
{
	char buf[100];
	memset(buf,0,100);
	GetDlgItem(IDC_EDIT1)->GetWindowText(buf,100);

        /*16文字か*/
	if(strlen(buf)!=16)
		return 0;

        /*最初の2文字がCRか*/
	if(strncmp(buf,"CR",2)!=0)
		return 0;

        /*決められた場所にハイフンがあるか*/
	if(buf[6] != '-' || buf[11] !='-')
		return 0;

        /*16進の数字かチェックしながら数字へ*/
	for(int i=0;i<3;i++){
		if(!myatoi(&buf[2+5*i]))
			return 0;
	}

        /*にっくきスレッド(笑)*/

	STRID strid;
	strid.s = buf;
	strid.id = m_sirial;

	/*スレッド作成*/
	CWinThread	*pThread=AfxBeginThread(ThreadCheck,(LPVOID)&strid,
			THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
	
	/*スレッドの終了時にオブジェクトを自動的に削除しない*/
	pThread->m_bAutoDelete=FALSE;
	
	/*これでスレッドの開始*/
	pThread->ResumeThread();
	
	/*スレッドが終了するまでまつ 
          Ollyが止まるとはしらなった。(笑)*/
	::WaitForSingleObject(pThread->m_hThread,INFINITE);
	
	
	DWORD		result;
        /*スレッドの返り値をresultに格納*/
	::GetExitCodeThread(pThread->m_hThread,&result);
	
	/*スレッドの削除*/
	delete pThread;
	if(result)
		MyMessageBox("Congratulations!!! ");

}


/*ちぇく部分
すでに、数字部分は、文字から数字へ変わっています。*
PASS  CR@ABC-DEFG-HIJK
ID    [1][2][3][4][5][6][7][8]*/
UINT __cdecl	ThreadCheck(LPVOID pParam)
{
	char*   str = ((STRID*)pParam)->s;
	DWORD   id = ((STRID*)pParam)->id;
	DWORD   m0,m1,m2;
	UCHAR   a,b,c,d;
	
        //m = @ABC
    m0=0;
	for(int i=0;i<4;i++){
		m0 <<= 4;
		m0 += str[2+i]&0xff;
	}
	
    //a = @A xor [1][2]
	a = (str[7]<<4)+str[8];
	a^= (id>>24)&0xff;

        //b = BC xor [3][4]
	b = (str[9]<<4)+str[10];
	b^= (id>>16)&0xff;
	
	//c = DE xor [5][6]
	c = (str[12]<<4)+str[13];
	c^= (id>>8)&0xff;
    
    //d = FG xor [7][8]
	d = (str[14]<<4)+str[15];
	d^= id&0xff;


        /* m0 = a*a*a + b*b*b = c*c*c + d*d*d
           ならクリア
          二通りの3乗の和で表せる数を求めればよい*/

         
    /*1通りで表されているときはじく*/
	if(a == c || a==d)
		return 0;

	m1 = a*a*a+b*b*b;
	m2 = c*c*c+d*d*d;
	
	if(m1 != m2)
		return 0;
	
	if(m0 == m2)
		return 1;
	else
		return 0;
}